package com.ruoyi.classai.utils.group;

import cn.hutool.core.collection.CollectionUtil;

import java.util.*;
import java.util.stream.Collectors;

/**
 * 分组工具类
 * @author lcj
 * @date 2025年03月05日 16:54
 */
public class GroupUtils {


    /**
     *  系统默认分组
     * @param students 学生
     * @return 分组信息
     */
    public static List<List<Student>> defaultRandomGroup(List<Student> students) {
        // 1. 按 groupId 分组，并按组ID升序排序
        Map<Integer, List<Student>> groupedAndSorted = students.stream()
                .collect(Collectors.groupingBy(
                        Student::getGroupId,
                        TreeMap::new,  // 自动按 groupId 升序排序
                        Collectors.toList()
                ));

        List<List<Student>> resList=new ArrayList<>();
        // 2. 输出结果
        groupedAndSorted.forEach((groupId, list) -> {
            resList.add(list);
        });
        return resList;
    }


    /**
     *  自定义分组
     * @param students 学生
     * @param groupSize 分组大小
     * @return 分组信息
     */
    public static List<List<Student>> randomGroup(List<Student> students, int groupSize) {
        Collections.shuffle(students); // 打乱顺序
        List<List<Student>> groups = new ArrayList<>();
        //计算每组多少人
        int groupNumber=groupNumber(students.size(),groupSize);
        for (int i = 0; i < students.size(); i += groupNumber) {
            int end = Math.min(i + groupNumber, students.size());
            groups.add(new ArrayList<>(students.subList(i, end)));
        }
        return groups;
    }

    /**
     *  男女自定义分组
     * @param students 学生
     * @param groupSize 分组大小
     * @return 分组信息
     */
    public static List<List<Student>> sexRandomGroup(List<Student> students, int groupSize) {
        // 按性别分组
        Map<String, List<Student>> groupedBySex = students.stream()
                .collect(Collectors.groupingBy(Student::getSex));

        // 按分数降序排序
//        groupedBySex.forEach((sex, list) ->
//                list.sort(Comparator.comparingDouble(Student::getScore).reversed())
//        );
        //计算每组多少人
        int groupNumber=groupNumber(students.size(),groupSize);
        // 自定义分组人数（如每组2人）
        Map<String, List<List<Student>>> result = new HashMap<>();

        groupedBySex.forEach((sex, list) ->
                result.put(sex, partitionList(list, groupNumber))
        );
        List<List<Student>> list1=result.get("男");
        List<List<Student>> list2=result.get("女");
        if (CollectionUtil.isNotEmpty(list1)&&CollectionUtil.isNotEmpty(list2)){
            list1.addAll(list2);
            return list1;
        }
        if (CollectionUtil.isNotEmpty(list1)){
            return list1;
        }else {
            return list2;
        }

    }

    public static <T> List<List<T>> partitionList(List<T> list, int groupSize) {
        List<List<T>> partitions = new ArrayList<>();
        for (int i = 0; i < list.size(); i += groupSize) {
            partitions.add(list.subList(i, Math.min(i + groupSize, list.size())));
        }
        return partitions;
    }

    /**
     *  计算分组人数
     * @param dividend 学生人数
     * @param divisor 分组数量
     * @return 分组人数
     */
    private static Integer groupNumber(Integer dividend, Integer divisor){
        int quotient = Math.floorDiv(dividend, divisor); // 计算商
        int remainder = Math.floorMod(dividend, divisor); // 计算余数

        if (remainder != 0) {
            quotient++; // 余数不为0时，商加一
        }
        return quotient;
    }


}
